package mobmap.util.imagecache;

import java.io.IOException;

import javax.microedition.lcdui.Image;

import mobmap.util.Log;


/**
 * Classe que representa um cache de imagens
 * para otimizar a utilização de momória do dispositivo
 * 
 * @author ulisses
 *
 */
public class Cache {
	
	private static ImageCache cacheImages[];
	
	//tamanho maximo de imagens no cache de figuras
	private final int CACHE_SIZE = 4;
	
	private int posicaoNovaImagem;
	private int cacheHit = 0;
	private int cacheMiss = 0;
	
	public Cache(){
		cacheImages = new ImageCache[CACHE_SIZE];
		posicaoNovaImagem = 0;
	}
	
	/**
	 * Faz uma busca no cache, e caso encontre a imagem desejada a retorna.
	 * Caso não encontre, cria uma nova e adiciona no cache.
	 * @param path
	 * @return
	 * @throws IOException
	 */
	public Image getImage(String path) throws IOException{
		
		int i;
		ImageCache imgCache;
		
		for (i=0; i < CACHE_SIZE; i++){
			ImageCache imageCache = cacheImages[i];
			//cache hit
			if (imageCache != null && path.equals(imageCache.getPath())){
				Log.out("Cache Hit: " + cacheHit++);
				return imageCache.getImage();
			}else if (imageCache == null){
				posicaoNovaImagem = i;
				break;
			}
		}
		
		//cache miss
		Log.out("Cache Miss: " + cacheMiss++);
		
		//tenta desalocar recurso
		if (cacheImages[posicaoNovaImagem] != null)
			cacheImages[posicaoNovaImagem] = null;
		
		cacheImages[posicaoNovaImagem] = new ImageCache(Image.createImage(path), path);
		imgCache = cacheImages[posicaoNovaImagem];
		posicaoNovaImagem++;

		//caso a posicao seja maior que o cache, 
		//volta a apontar para a posicao 0
		if (posicaoNovaImagem > CACHE_SIZE-1){
			posicaoNovaImagem = 0;
		}
		//run garbage collector
		////System.gc();
		return imgCache.getImage();
	}


	public int getCacheHit() {
		return cacheHit;
	}

	public int getCacheMiss() {
		return cacheMiss;
	}
	
}
